package reflection_generics_containers.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * @author LiuYan
 * @date 2023/7/17
 * getField 只能获取public的，包括从父类继承来的字段
 * getDeclaredField 可以获取本类所有的字段，但是不能获取继承父类的字段
 * 这里只能获取到private的字段，但并不能访问该private字段的值，除非加上setAccessible(true)
 */
public class ReflectionField {

    public static void main(String[] args) throws Throwable {
        // 获取Person的字节码
        Class personClass = Person.class;
        // 获取构造器对象
        Constructor constructor = personClass.getConstructor();
        // 获取对象实例
        Person person = (Person) constructor.newInstance();
        person.setName("ly");
        // 通过Class对象，获取Field对象
        Field nameField = personClass.getField("name");
        System.out.println("获取字段的类型：" + nameField.getType());
        System.out.println("获取字段的名字：" + nameField.getName());
        System.out.println("获取字段的访问修饰符：" + Modifier.toString(nameField.getModifiers()));
        System.out.println("获取字段所在类的全路径：" + nameField.getDeclaringClass().getName());
        // 获取字段的类型
        String name = String.valueOf(nameField.get(person));
        System.out.println(name);
    }
}
